home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Games
/
MAME
/
src
/
sound
/
samples.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-04-23
|
3KB
|
121 lines
#include "driver.h"
static int firstchannel,numchannels;
/* Start one of the samples loaded from disk. Note: channel must be in the range */
/* 0 .. Samplesinterface->channels-1. It is NOT the discrete channel to pass to */
/* mixer_play_sample() */
void sample_start(int channel,int samplenum,int loop)
{
if (Machine->sample_rate == 0) return;
if (Machine->samples == 0) return;
if (Machine->samples->sample[samplenum] == 0) return;
if (channel >= numchannels)
{
logerror("error: sample_start() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
return;
}
if (samplenum >= Machine->samples->total)
{
logerror("error: sample_start() called with samplenum = %d, but only %d samples available\n",samplenum,Machine->samples->total);
return;
}
if ( Machine->samples->sample[samplenum]->resolution == 8 )
{
logerror("play 8 bit sample %d, channel %d\n",samplenum,channel);
mixer_play_sample(firstchannel + channel,
Machine->samples->sample[samplenum]->data,
Machine->samples->sample[samplenum]->length,
Machine->samples->sample[samplenum]->smpfreq,
loop);
}
else
{
logerror("play 16 bit sample %d, channel %d\n",samplenum,channel);
mixer_play_sample_16(firstchannel + channel,
(short *) Machine->samples->sample[samplenum]->data,
Machine->samples->sample[samplenum]->length,
Machine->samples->sample[samplenum]->smpfreq,
loop);
}
}
void sample_set_freq(int channel,int freq)
{
if (Machine->sample_rate == 0) return;
if (Machine->samples == 0) return;
if (channel >= numchannels)
{
logerror("error: sample_adjust() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
return;
}
mixer_set_sample_frequency(channel + firstchannel,freq);
}
void sample_set_volume(int channel,int volume)
{
if (Machine->sample_rate == 0) return;
if (Machine->samples == 0) return;
if (channel >= numchannels)
{
logerror("error: sample_adjust() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
return;
}
mixer_set_volume(channel + firstchannel,volume * 100 / 255);
}
void sample_stop(int channel)
{
if (Machine->sample_rate == 0) return;
if (channel >= numchannels)
{
logerror("error: sample_stop() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
return;
}
mixer_stop_sample(channel + firstchannel);
}
int sample_playing(int channel)
{
if (Machine->sample_rate == 0) return 0;
if (channel >= numchannels)
{
logerror("error: sample_playing() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
return 0;
}
return mixer_is_sample_playing(channel + firstchannel);
}
int samples_sh_start(const struct MachineSound *msound)
{
int i;
int vol[MIXER_MAX_CHANNELS];
const struct Samplesinterface *intf = msound->sound_interface;
/* read audio samples if available */
Machine->samples = readsamples(intf->samplenames,Machine->gamedrv->name);
numchannels = intf->channels;
for (i = 0;i < numchannels;i++)
vol[i] = intf->volume;
firstchannel = mixer_allocate_channels(numchannels,vol);
for (i = 0;i < numchannels;i++)
{
char buf[40];
sprintf(buf,"Sample #%d",i);
mixer_set_name(firstchannel + i,buf);
}
return 0;
}